#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "Globales.h"
#include "TCola.h"

void TCola_Crear(TCola *pC, int iTamanioDato) {
  pC->Primero = NULL;
  pC->Ultimo = NULL;
  pC->TamanioDato = iTamanioDato;
}

void TCola_Vaciar(TCola *pC) {
  TNodoCola *pAux = pC->Primero;
  TNodoCola *pSig;
  while (pAux) {
    pSig = pAux->Siguiente;
    free(pAux->Elem);
    free(pAux);
    pAux = pSig;
  }
  pC->Primero = NULL;
  pC->Ultimo = NULL;
}

eBoolean TCola_Vacia(TCola C) {
  if (C.Primero==NULL) {
    return ebTrue;
  } else {
    return ebFalse;
  };
}

eBoolean TCola_Agregar(TCola *pC, void* pE) {
  TNodoCola *pNodo = (TNodoCola*) malloc(sizeof(TNodoCola));
  if (!pNodo) {
    return ebFalse;
  } else {
    if (pC->Ultimo) {
      pC->Ultimo->Siguiente = pNodo;
    }
    if (!pC->Primero) {
      pC->Primero = pNodo;
    }
    pNodo->Siguiente = NULL;
    pC->Ultimo = pNodo;
    pNodo->Elem = malloc (pC->TamanioDato);
    memcpy(pNodo->Elem, pE, pC->TamanioDato);
    return ebTrue;
  };
}

eBoolean TCola_Sacar(TCola *pC, void* pE) {
  TNodoCola *pAux = pC->Primero;
  pC->Primero = pC->Primero->Siguiente;
  if (!pC->Primero) {
    pC->Ultimo = NULL;
  };
  memcpy(pE, pAux->Elem, pC->TamanioDato);
  free(pAux->Elem);
  free(pAux);
  return ebTrue;
}
